// src/api/request.ts

import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse, AxiosError } from 'axios';
import { message } from 'antd';

// 定义后端返回数据的通用格式（根据你的实际 API 格式调整！）
interface ApiResponse<T = any> {
  code: number;       // 例如：200 表示成功
  data: T;            // 业务数据
  message?: string;   // 提示信息
}

// 创建 axios 实例
const request: AxiosInstance = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL || 'http://localhost:8080', // 支持 Vite 环境变量
  timeout: 10000, // 请求超时时间
});

// 请求拦截器
request.interceptors.request.use(
  (config) => {
    // 例如从 localStorage 获取 token，并添加到请求头
    const token = localStorage.getItem('token'); // 可根据实际情况从 Redux / Context / Zustand 获取
    if (token && config.headers) {
      config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
  },
  (error: AxiosError) => {
    console.error('🔴 Request Error:', error);
    return Promise.reject(error);
  }
);

// 响应拦截器
request.interceptors.response.use(
  (response: AxiosResponse<ApiResponse>) => {
    const { code, data, message: msg } = response.data;

    // 假设后端约定：code 为 200 表示成功，其他为业务错误
    if (code === 200) {
      return data; // 直接返回业务数据部分
    } else {
      // 业务逻辑错误，如 token 过期、无权限、参数校验失败等
      message.error(msg || '请求失败');
      return Promise.reject(new Error(msg || '业务错误'));
    }
  },
  (error: AxiosError) => {
    console.error('🔴 Response Error:', error);

    if (error.response) {
      const { status, data } = error.response;

      const errorData = data as { message?: string; msg?: string };
      const serverMsg = errorData.message ?? errorData.msg ?? `请求失败，状态码：${status}`;

      switch (status) {
        case 401:
          message.error('未授权，请重新登录');
          // 可跳转登录页
          // window.location.href = '/login';
          break;
        case 403:
          message.error('拒绝访问');
          break;
        case 404:
          message.error('请求的资源不存在');
          break;
        case 500:
          message.error('服务器内部错误');
          break;
        default:
          // 尝试解析后端返回的错误信息
          message.error(serverMsg);
      }
    } else if (error.request) {
      // 请求发出，但没有收到响应（网络问题）
      message.error('网络异常，请检查网络连接');
    } else {
      // 其他错误
      message.error(error.message || '请求失败');
    }

    return Promise.reject(error);
  }
);

// 封装通用请求方法（可选，也可以直接使用 request.get() 等）
export const http = {
  get: <T = any>(url: string, params?: any, config?: AxiosRequestConfig) =>
    request.get<T>(url, { ...config, params }),

  post: <T = any>(url: string, data?: any, config?: AxiosRequestConfig) =>
    request.post<T>(url, data, config),

  put: <T = any>(url: string, data?: any, config?: AxiosRequestConfig) =>
    request.put<T>(url, data, config),

  delete: <T = any>(url: string, config?: AxiosRequestConfig) =>
    request.delete<T>(url, config),

  // 可以继续添加 patch 等
};

// 同时导出原始的 axios 实例，便于高级用法
export default request;